package cn.itcast.t_exclusiveGateWay;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

public class exclusiveGateWayTest {
	ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
	@Test
	public void deploymentProcessDefinition(){
		InputStream inputStreambpmn=this.getClass().getResourceAsStream("exclusiveGateWay.bpmn");
		InputStream inputStreampng=this.getClass().getResourceAsStream("exclusiveGateWay.png");
	Deployment deployment	=processEngine.getRepositoryService()//与流程定义和部署对象关联的
		            .createDeployment()//创建部署对象
		            .name("排他网关")
		            .addInputStream("exclusiveGateWay.bpmn", inputStreambpmn)
		            .addInputStream("exclusiveGateWay.png", inputStreampng)
		            .deploy();//完成部署
	System.out.println("部署ID"+deployment.getId());
	System.out.println("部署名称"+deployment.getName());
	}
	//查询当前人的个人任务
		@Test
		public void findMyPersonalTesk(){
				
		List<Task> list=processEngine.getTaskService()//与正在执行的任务相关的service
				                    .createTaskQuery()//创建人物查询对象
				                    .taskAssignee("赵六")
				                    .list();
		if(list!=null&&list.size()>=0){
			for(Task task:list){
			System.out.println("任务ID"+task.getId());
			System.out.println("任务名字"+task.getName());
			System.out.println("任务办理人"+task.getAssignee());
			System.out.println("流程实例id"+task.getProcessInstanceId());
			System.out.println("流程定义id"+task.getProcessDefinitionId());
			}	
		}
		}
		//启动流程实例
	@Test
	public void startProcessInstance(){
		
	ProcessInstance p1=	processEngine.getRuntimeService()//与正在执行的流程实例和和执行对象相关的service
	                 .startProcessInstanceByKey("exclusiveGateWay");//使用流程对应的key启动流程实例，与hello.bpmn中id对应,默认对应最新版本流程使用
	System.out.println(p1.getId());//流程实例id
	System.out.println(p1.getProcessDefinitionId());//流程定义id
	
	}
	/**
	 * act_ru_execution正在执行的执行对象表(1、ID执行对象ID，proc_icst_id_流程实例id，当流程是单利流程，没有分支和聚合时，两者值相同
	 *                                     2、如果流程流程实例可以有多个，执行对象可以存在多个（如果存在分支和聚合））
	 * act_hi_procinst流程实例历史表、
	 * act_ru_task：正在执行任务表（只有节点是UserTask的时候该表中才能存数据）
	 * act_hi_taskinst任务历史表
	 * act_hi_actinst所有活动节点历史表
	 */
	//完成我的任务
		@Test
		public void completeMyPersonalTesk(){
			String taskId="6004";
			//完成任务的同时设置流程变量，使用流程变量用来指定完成任务后，下一个连线对应exclusiveGateWay.bpmn中${money=='不重要'}
			Map<String, Object>  variables=new HashMap<String, Object>();
			variables.put("money", 200);
			processEngine.getTaskService()
			              .complete(taskId,variables);
			System.out.println("1");
			
		}	
		//查询流程状态（流程正在执行还是结束）
		@Test
		public void isProcessEnd(){
			String processInstanceId="5301";
			ProcessInstance pi=processEngine.getRuntimeService()
//			             .createExecutionQuery()//查询正在执行的
//			             .executionId(executionId)
                         .createProcessInstanceQuery()//创建流程实例查询
                         .processInstanceId(processInstanceId)
                         .singleResult();
			if(pi!=null){
				System.out.println("当前流程在"
						+pi.getActivityId());
			}else{
				System.out.println("流程已经结束");
			}
			
		}
	//查询历史任务
		@Test
		public void getHistoryTest(){
		List<HistoricTaskInstance> list=	processEngine.getHistoryService()//与历史数据相关的service
			             .createHistoricTaskInstanceQuery()
//			             .taskAssignee("张三")//制定历史人物的办理人
			             .list();
		if(list!=null&&list.size()>0){
			for(HistoricTaskInstance hi:list){
				System.out.println(hi.getId()+hi.getName()+hi.getProcessInstanceId());
				System.out.println("************************"+list.size());
			}
			
		}
		}
		//查询历史流程实例
		@Test
		public void getHistoryProcessInstance(){
		HistoricProcessInstance p=	processEngine.getHistoryService()
			             .createHistoricProcessInstanceQuery()
//			             .processDefinitionId(processDefinitionId)
			             .processInstanceId("1301")
			             .singleResult();
			System.out.println(p.getProcessDefinitionId()+p.getId());
			
		}
}
